home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOpus Plus
/
DOpus Plus.iso
/
Tutorial
/
C Guide
/
Time_module
/
IconClock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-09-20
|
61KB
|
1,534 lines
#include "includes/Clock.h"
/********************************************************************/
struct Gadget gadgets[] =
{
{ // the dragbar
&gadgets[1],
12, 0, -24, 8,
GFLG_GADGHNONE | GFLG_RELWIDTH,
GACT_RELVERIFY, GTYP_WDRAGGING,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL
},
{ // the close gadget
&gadgets[2],
0, 0, 12, 8,
GFLG_GADGHNONE,
GACT_RELVERIFY, GTYP_CLOSE,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL
},
{ // the tofront/toback gadget
NULL,
-12, 0, 12, 8,
GFLG_GADGHNONE | GFLG_RELRIGHT,
GACT_RELVERIFY, GTYP_WDEPTH,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL
}
};
enum
{
GADGET_ID_TEXT,
GADGET_ID_HOURS,
GADGET_ID_MINUTES,
GADGET_ID_STRING,
GADGET_ID_OK,
GADGET_ID_CANCEL
};
struct TagItem slider[] =
{
GA_RelVerify, TRUE,
GTSL_Max, 59,
TAG_DONE
};
ObjectDef winobjects[] =
{
{
OD_GADGET, TEXT_KIND,
{ 0, 0, SIZE_MAXIMUM, 3 },
{ 2, 2, -2, 0 },
MSG_ALARM, PLACETEXT_IN,
GADGET_ID_TEXT, NULL
},
{
OD_GADGET, TEXT_KIND,
{ 0, 3, SIZE_MAXIMUM, 1 },
{ 2, 4, -2, 4 },
NULL, PLACETEXT_IN,
GADGET_ID_STRING, NULL
},
{
OD_GADGET, SLIDER_KIND,
{ 10, 4, SIZE_MAXIMUM, 1 },
{ 2, 10, -2, 4 },
MSG_HOURS, PLACETEXT_LEFT,
GADGET_ID_HOURS, &slider[0]
},
{
OD_GADGET, SLIDER_KIND,
{ 10, 5, SIZE_MAXIMUM, 1 },
{ 2, 14, -2, 4 },
MSG_MINS, PLACETEXT_LEFT,
GADGET_ID_MINUTES, &slider[0]
},
{
OD_GADGET, BUTTON_KIND,
{ 0, POS_RIGHT_JUSTIFY, 10, 1 },
{ 2, -2, -4, 4 },
MSG_OK, PLACETEXT_IN | BUTTONFLAG_OKAY_BUTTON,
GADGET_ID_OK, NULL
},
{
OD_GADGET, BUTTON_KIND,
{ POS_RIGHT_JUSTIFY, POS_RIGHT_JUSTIFY, 10, 1 },
{ -2, -2, -4, 4 },
MSG_CANCEL, PLACETEXT_IN | BUTTONFLAG_CANCEL_BUTTON,
GADGET_ID_CANCEL, NULL
},
{ OD_END }
};
ConfigWindow cfgwin =
{
{ POS_CENTER, POS_CENTER, 30, 8 },
{ 0, 0, 4, 20 }
};
/********************************************************************/
// PROTOS
extern BOOL WriteConfig( ClockData *cd );
extern BOOL ReadConfig( ClockData *cd );
void Deteach( struct Screen *screen);//, IPC_CMDData *idata );
void __saveds TimerClock( void );
ULONG __asm __saveds clock_startup( register __a0 IPCData *ipc,
register __a1 ClockData *cd );
BOOL HandleIDCMP( ClockData *cd );
BOOL DoMenu( ClockData *cd );
struct Window *OpenWin( ClockData *cd );
void CloseWin( ClockData *cd );
void __asm refresh_callback( register __d0 ULONG type,
register __a0 struct Window *win,
register __a1 ClockData * cd );
void BorderDraw( ClockData *cd );
void PrintTime( ClockData *cd );
void About( ClockData *cd );
void GetSizes( ClockData *cd );
void FRequest( ClockData *cd );
BOOL PicRequest( ClockData *cd );
void DisableOther( PopUpMenu *popmenu, ULONG start, ULONG end, ULONG exclude );
BOOL GetBitMap( ClockData *cd, STRPTR name );
void BeepBeep( ClockData *cd );
void GetAlarm( ClockData *cd );
BOOL HandleOwnRequest( ClockData *cd );
BOOL HandleIPC( ClockData *cd );
void InitPopMenu( ClockData *cd );
/********************************************************************/
void Deteach( struct Screen *screen)//, IPC_CMDData *idata )
{
ClockData *cd;
if( (cd = AllocMemH( mempool, sizeof(ClockData))) )
{
cd->screen = screen;
cd->a4 = getreg( REG_A4 );
cd->module = (struct Library *) getreg( REG_A6 );
cd->library = DOpusBase;
ReadConfig( cd );
cd->txtattr.ta_Name = cd->fontname;
if( !IPC_Launch(0, &clock_ipc, "Timer_Clock",
(ULONG) TimerClock, 4000,
(ULONG) cd, DOSBase) )
FreeMemH( cd );
}
}
/********************************************************************/
void __saveds TimerClock( void )
{
struct Library *DOpusBase;
IPCData *ipc;
ClockData *cd;
if (!(DOpusBase=(struct Library *)FindName(&((struct ExecBase *)*((ULONG *)4))->LibList,"dopus5.library")))
return;
ipc = IPC_ProcStartup( (ULONG *) &cd, clock_startup);
putreg( REG_A4, cd->a4 );
if( !ipc )
{
IPC_Free( cd->ipc );
FreeMemH( cd );
return;
}
WaitPort( cd->ipc->command_port );
if( HandleIPC( cd ) )
{
IPC_Free( cd->ipc );
FreeMemH( cd );
return;
}
OpenWin( cd );
SetSoftStyle( cd->win->RPort, cd->itext[2].ITextFont->ta_Style, AskSoftStyle( cd->win->RPort));
cd->day = 1;
BorderDraw( cd);
PrintTime( cd );
if( (cd->th = AllocTimer(UNIT_VBLANK, 0)) )
{
StartTimer( cd->th, 0, 900000 );
while( TRUE )
{
cd->signals = Wait( 1 << cd->th->port->mp_SigBit |
1 << cd->notify_port->mp_SigBit |
1 << cd->ipc->command_port->mp_SigBit |
(cd->win ? 1 << cd->win->UserPort->mp_SigBit : 0) |
(cd->time_req ? 1 << cd->time_req->UserPort->mp_SigBit : 0) |
(cd->req ? 1 << cd->req->UserPort->mp_SigBit : 0) );
if( HandleOwnRequest( cd) )
{
CloseConfigWindow( cd->time_req );
cd->time_req = NULL;
}
if( cd->signals & 1 << cd->th->port->mp_SigBit )
{
GetMsg( cd->th->port );
PrintTime( cd );
StartTimer( cd->th, 0, 900000 );
}
cd->running = 0;
if( cd->signals & 1 << cd->ipc->command_port->mp_SigBit )
{
cd->running = HandleIPC( cd );
}
if( cd->signals & 1 << cd->notify_port->mp_SigBit )
{
while( (cd->nmsg = (APTR) GetMsg(cd->notify_port)) )
{
if( cd->nmsg->dn_Type & DN_OPUS_QUIT )
cd->running = TRUE;
if( cd->win && (cd->nmsg->dn_Type & DN_OPUS_HIDE) )
{
cd->ibox.Left = cd->win->LeftEdge;
cd->ibox.Top = cd->win->TopEdge;
cd->ibox.Width = cd->win->Width;
cd->ibox.Height = cd->win->Height;
CloseWin( cd );
cd->win = NULL;
cd->day = 1;
}
if( !cd->win && (cd->nmsg->dn_Type & DN_OPUS_SHOW) )
{
cd->screen = ((struct Window *) cd->nmsg->dn_Data)->WScreen;
// FRAGLICH !! (wegen der Geschwindigkeit...)
OpenWin( cd );
}
ReplyFreeMsg( (APTR) cd->nmsg );
}
}
if( cd->running || (cd->win && HandleIDCMP(cd)) )
break;
if( cd->req && SysReqHandler(cd->req, NULL, FALSE) > -2 )
{
FreeSysRequest( cd->req );
cd->req = NULL;
}
}
}
CloseWin( cd );
if( cd->time_req )
CloseConfigWindow( cd->time_req );
if( cd->bm )
FreeBitMap( cd->bm );
FreeTimer( cd->th );
if( cd->sound )
DisposeDTObject( cd->sound );
if( cd->alarm )
DisposeDTObject( cd->alarm );
while( !IsListEmpty((struct List *) &cd->popmenu.item_list) )
FreeMemH( RemTail((struct List *) &cd->popmenu.item_list) );
while( !IsListEmpty((struct List *) &cd->submenu) )
FreeMemH( RemTail((struct List *) &cd->submenu) );
while( !IsListEmpty((struct List *) &cd->subtime) )
FreeMemH( RemTail((struct List *) &cd->subtime) );
CloseFont( cd->txtfont );
if( cd->notify_port )
{
if( cd->notify )
RemoveNotifyRequest( cd->notify );
while( (cd->nmsg = (APTR) GetMsg(cd->notify_port)) )
ReplyFreeMsg( (APTR) cd->nmsg );
DeleteMsgPort( cd->notify_port );
}
--cd->module->lib_OpenCnt;
IPC_Free( cd->ipc );
FreeMemH( cd );
clock_ipc = NULL;
}
/********************************************************************/
ULONG __asm __saveds clock_startup( register __a0 IPCData *ipc,
register __a1 ClockData *cd )
{
struct Library *DOpusBase;
putreg( REG_A4,cd->a4 );
cd->ipc = ipc;
DOpusBase = cd->library;
if( !cd->screen )
UnlockPubScreen( NULL, (cd->screen = LockPubScreen(NULL)) );
if( !cd->txtattr.ta_YSize )
cd->txtattr.ta_YSize = cd->screen->Font->ta_YSize;
if( cd->fontname )
{
if( Strnicmp(&cd->fontname[cd->running=strlen(cd->fontname)-5], ".font", 5) )
strcat( cd->fontname, ".font" );
}
else
strcpy( cd->txtattr.ta_Name, cd->screen->Font->ta_Name );
cd->txtfont = OpenDiskFont( &cd->txtattr );
if( !cd->itext[0].FrontPen )
cd->itext[0].FrontPen = 1;
for( cd->running = 0; cd->running < 3; cd->running++ )
{
cd->itext[cd->running].IText = &cd->ibuffer[cd->running][0];
cd->itext[cd->running].FrontPen = cd->itext[0].FrontPen;
cd->itext[cd->running].BackPen = cd->itext[0].BackPen;
cd->itext[cd->running].DrawMode = cd->itext[0].DrawMode;
cd->itext[cd->running].ITextFont = &cd->txtattr;
if( cd->running < 2 )
cd->itext[cd->running].NextText = &cd->itext[cd->running+1];
}
GetSizes( cd );
if( !cd->ibox.Left )
{
if( !(cd->flags & LEFT_PASSED) )
cd->ibox.Left = DEFAULT_LEFT_EDGE;
}
if( (cd->ibox.Left + cd->ibox.Width) > (cd->screen->LeftEdge + cd->screen->Width) )
cd->ibox.Left = cd->screen->LeftEdge + cd->screen->Width - cd->ibox.Width;
if( !cd->ibox.Top )
{
if( !(cd->flags & TOP_PASSED) )
cd->ibox.Top = DEFAULT_TOP_EDGE;
}
if( (cd->ibox.Top + cd->ibox.Height) > (cd->screen->TopEdge + cd->screen->Height) )
cd->ibox.Top = cd->screen->TopEdge + cd->screen->Height - cd->ibox.Height;
cd->flags >>= 9;
cd->flags <<= 9;
if( (cd->flags & BG_TRANS) ||
(cd->flags & BG_PIC) )
{
cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
cd->screen->RastPort.BitMap->Depth,
BMF_MINPLANES, cd->screen->RastPort.BitMap );
if( cd->flags & BG_PIC )
{
if( GetBitMap(cd, cd->picture) )
{
cd->flags >>= 11;
cd->flags <<= 11;
}
else
cd->flags ^= BG_PIC;
}
if( cd->flags & BG_TRANS )
{
cd->flags >>= 10;
cd->flags <<= 10;
}
}
if( !(cd->flags & BG_PIC) &&
!(cd->flags & BG_TRANS) )
cd->flags |= BG_PLAIN;
if( cd->flags & BORDER_OFF )
{
if( cd->flags & BORDER )
cd->flags ^= BORDER;
cd->flags ^= BORDER_OFF;
}
else
{
if( cd->flags & BORDER_ON )
{
cd->flags |= BORDER;
cd->flags ^= BORDER_ON;
}
}
cd->day = 1;
if( (cd->notify_port = CreateMsgPort()) )
{
cd->notify = AddNotifyRequest( DN_OPUS_QUIT | DN_OPUS_HIDE | DN_OPUS_SHOW,
NULL, cd->notify_port );
}
InitPopMenu( cd );
++cd->module->lib_OpenCnt;
return 1;
}
/********************************************************************/
BOOL HandleIDCMP( ClockData *cd )
{
while( (cd->inmsg = GT_GetIMsg(cd->win->UserPort)) )
{
cd->imsg = *cd->inmsg;
GT_ReplyIMsg( cd->inmsg );
switch( cd->imsg.Class )
{
case IDCMP_REFRESHWINDOW:
refresh_callback( 0, cd->win, cd );
break;
case IDCMP_CHANGEWINDOW:
cd->ibox.Left = cd->win->LeftEdge;
cd->ibox.Top = cd->win->TopEdge;
cd->ibox.Width = cd->win->Width;
cd->ibox.Height = cd->win->Height;
CloseWin( cd );
OpenWin( cd );
break;
case IDCMP_ACTIVEWINDOW:
case IDCMP_INACTIVEWINDOW:
cd->day = 1;
BorderDraw( cd );
PrintTime( cd );
break;
case IDCMP_CLOSEWINDOW:
if( cd->req )
break;
return TRUE;
case IDCMP_MOUSEBUTTONS:
if( !cd->req && cd->imsg.Code == SELECTDOWN &&
DoMenu(cd) )
return TRUE;
break;
}
}
return FALSE;
}
BOOL DoMenu( ClockData *cd )
{
if( DoPopUpMenu(cd->win, &cd->popmenu, &cd->popitem, SELECTDOWN) != -1 )
{
switch( cd->popitem->id )
{
case POPID_SOUND: cd->flags ^= SOUND;
//if( cd->flags
break;
case POPID_FIX_IT: WriteConfig( cd );
break;
case POPID_BORDER:
if( cd->popitem->flags & POPUPF_CHECKED )
cd->flags |= BORDER;
else
cd->flags ^= (cd->flags & BORDER) ? BORDER : 0;
BorderDraw( cd );
break;
case POPID_AUTOSTART:
SetEnv( CLOCKSTARTVAR, (cd->popitem->flags & POPUPF_CHECKED) ? "1" : "0", TRUE );
break;
case POPID_CHANGE_FONT:
cd->ibox.Left = cd->win->LeftEdge;
cd->ibox.Top = cd->win->TopEdge;
CloseWin( cd );
if( cd->bm )
{
FreeBitMap( cd->bm );
cd->bm = NULL;
}
FRequest( cd );
GetSizes( cd );
if( cd->flags & BG_PIC ||
cd->flags & BG_TRANS )
{
cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
cd->screen->RastPort.BitMap->Depth,
BMF_MINPLANES, cd->screen->RastPort.BitMap );
if( cd->flags & BG_PIC )
GetBitMap( cd, cd->picture );
}
OpenWin( cd );
break;
case POPID_CLOSE:
return TRUE;
case POPID_ALARMSET: GetAlarm( cd );
break;
case POPID_ALARMONOFF:
if( cd->popitem->flags & POPUPF_CHECKED )
cd->flags |= ALARM;
else
cd->flags ^= ALARM;
break;
case POPID_ABOUT:
if( !cd->req )
About( cd );
break;
case POPID_PLAIN:
cd->flags = (cd->flags & BORDER) ? BORDER|BG_PLAIN : BG_PLAIN;
if( cd->bm )
{
FreeBitMap( cd->bm );
cd->bm = NULL;
}
BorderDraw( cd );
DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, cd->popitem->id );
break;
case POPID_TRANSPARENT:
cd->flags = (cd->flags & BORDER) ? BORDER|BG_TRANS : BG_TRANS;
CloseWin( cd );
if( !cd->bm )
{
cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
cd->screen->RastPort.BitMap->Depth,
BMF_MINPLANES, cd->screen->RastPort.BitMap );
}
OpenWin( cd );
DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, cd->popitem->id );
break;
case POPID_PICTURE:
CloseWin( cd );
if( (PicRequest(cd) && cd->picture[0]) )
{
if( !cd->bm )
{
cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
cd->screen->RastPort.BitMap->Depth,
BMF_MINPLANES, cd->screen->RastPort.BitMap );
}
if( GetBitMap(cd, cd->picture) )
{
cd->flags = (cd->flags & BORDER) ? BORDER|BG_PIC : BG_PIC;
DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, cd->popitem->id );
}
else
cd->popitem->flags ^= POPUPF_CHECKED;
}
else
{
if( cd->flags & BG_PIC )
GetPopUpItem( &cd->popmenu, POPID_PICTURE )->flags |= POPUPF_CHECKED;
else
cd->popitem->flags ^= POPUPF_CHECKED;
}
OpenWin( cd );
break;
}
}
return FALSE;
}
/********************************************************************/
// WINDOW STUFF
struct Window *OpenWin( ClockData *cd )
{
if( (cd->pubscr = FindPubScreen(cd->screen, TRUE)) )
{
if( cd->bm && (cd->flags & BG_TRANS) )
BltBitMap( cd->screen->RastPort.BitMap,
cd->ibox.Left, cd->ibox.Top,
cd->bm,
0, 0,
cd->ibox.Width, cd->ibox.Height,
ABNC|ABC,
-1, NULL );
cd->win = OpenWindowTags( NULL,
WA_Left, cd->ibox.Left,
WA_Top, cd->ibox.Top,
WA_Height, cd->ibox.Height,
WA_Width, cd->ibox.Width,
WA_Gadgets, &gadgets[0],
WA_Flags, WFLG_BORDERLESS | WFLG_NEWLOOKMENUS |
WFLG_SIMPLE_REFRESH,
WA_IDCMP, IDCMP_CHANGEWINDOW | IDCMP_REFRESHWINDOW |
IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW |
IDCMP_CLOSEWINDOW | IDCMP_MOUSEBUTTONS,
WA_AutoAdjust, TRUE,
WA_ScreenTitle, VERSION_STRING,
WA_PubScreen, cd->pubscr->psn_Screen,
TAG_DONE );
BorderDraw( cd );
cd->day = 1;
PrintTime( cd );
UnlockPubScreen( NULL, cd->pubscr->psn_Screen );
}
return cd->win;
}
void CloseWin( ClockData *cd )
{
if( cd->req )
{
FreeSysRequest( cd->req );
cd->req = NULL;
}
CloseWindow( cd->win );
}
// USED FOR REFRESH ON IDCMP-MESSAGES *AND* FOR THE POPUP-MENU
void __asm refresh_callback( register __d0 ULONG type,
register __a0 struct Window *win,
register __a1 ClockData *cd )
{
GT_BeginRefresh( win );
cd->day = 1;
BorderDraw( cd );
PrintTime( cd );
GT_EndRefresh( win, TRUE );
}
/********************************************************************/
void BorderDraw( ClockData *cd )
{
if( cd->bm )
BltBitMapRastPort( cd->bm,
0, 0,
cd->win->RPort,
0, 0,
cd->win->Width, cd->win->Height,
ABNC|ABC );
else
EraseRect( cd->win->RPort,
0, 0,
cd->win->Width, cd->win->Height );
if( !(cd->flags & BORDER) )
return;
SetAPen( cd->win->RPort, 1 );
Move( cd->win->RPort, 1, cd->win->Height - 1 );
Draw( cd->win->RPort, cd->win->Width-1, cd->win->Height - 1 );
Draw( cd->win->RPort, cd->win->Width-1, 1 );
SetAPen( cd->win->RPort, 2 );
Move( cd->win->RPort, 0, cd->win->Height - 1 );
Draw( cd->win->RPort, 0, 0 );
Draw( cd->win->RPort, cd->win->Width-1, 0 );
}
void PrintTime( ClockData *cd )
{
DateStamp( &cd->date );
cd->hour = UDivMod32( cd->date.ds_Minute, 60 );
cd->minute = getreg(REG_D1);
if( cd->day && cd->day != cd->date.ds_Days )
{
cd->dt.dat_Stamp = cd->date;
cd->dt.dat_Format = FORMAT_DOS;
cd->dt.dat_Flags = 0;
cd->dt.dat_StrDay = cd->itext[1].IText;
cd->dt.dat_StrDate = cd->itext[0].IText;
cd->dt.dat_StrTime = 0;
DateToStr( &cd->dt );
}
if( cd->bm )
BltBitMapRastPort( cd->bm,
cd->itext[2].LeftEdge, cd->itext[2].TopEdge+10,
cd->win->RPort,
cd->itext[2].LeftEdge, cd->itext[2].TopEdge+10,
IntuiTextLength(&cd->itext[2]), (cd->itext[2].ITextFont ? cd->itext[2].ITextFont->ta_YSize : cd->screen->Font->ta_YSize),
ABNC|ABC );
else
{
EraseRect( cd->win->RPort,
2, 8,
cd->win->Width - 4,
( (cd->day != cd->date.ds_Days) ? cd->win->Height - 2 : 9 + (cd->itext[2].ITextFont ? cd->itext[2].ITextFont->ta_YSize : cd->screen->Font->ta_YSize)) );
}
sprintf( cd->itext[2].IText, "%02ld%lc%02ld", cd->hour, UDivMod32(cd->date.ds_Tick, TICKS_PER_SECOND)%2 ? ':' : '.', cd->minute );
for( cd->running = 0; cd->running < 3; cd->running++ )
{
cd->itext[cd->running].LeftEdge = (cd->win->Width - IntuiTextLength(&cd->itext[cd->running]))/2;
cd->itext[2-cd->running].TopEdge = (cd->win->Height-10)/3*cd->running;
}
cd->running = 2;
if( cd->day != cd->date.ds_Days )
{
cd->running = 0;
if( cd->bm )
BltBitMapRastPort( cd->bm,
2, 8,
cd->win->RPort,
2, 8,
cd->win->Width-4, cd->win->Height-12,
ABNC|ABC );
cd->day = cd->date.ds_Days;
}
PrintIText( cd->win->RPort, &cd->itext[cd->running], 0, 10 );
BeepBeep( cd );
}
/********************************************************************/
void About( ClockData *cd )
{
cd->es.es_StructSize = sizeof( struct EasyStruct );
cd->es.es_Title = DOpusGetString( locale, MSG_TITLE );
cd->es.es_TextFormat = DOpusGetString( locale, MSG_CLOCKABOUT );
cd->es.es_GadgetFormat = DOpusGetString( locale, MSG_CLOCKOK );
cd->req = BuildEasyRequestArgs( cd->win, &cd->es, IDCMP_GADGETUP, NULL );
}
void GetSizes( ClockData *cd )
{
strcpy( cd->itext[2].IText, " 88-FEB-88 " );
cd->ibox.Width = IntuiTextLength( &cd->itext[2] ) + 4;
cd->ibox.Height = (cd->itext[2].ITextFont ? cd->itext[2].ITextFont->ta_YSize : cd->screen->Font->ta_YSize) * 3 + 18;
}
/********************************************************************/
void FRequest( ClockData *cd )
{
if( (cd->freq = AllocAslRequest(ASL_FontRequest, NULL)) )
{
if( AslRequestTags( cd->freq,
ASLFO_Screen, cd->screen,
ASLFO_DoFrontPen, TRUE,
ASLFO_DoBackPen, TRUE,
ASLFO_DoDrawMode, TRUE,
ASLFO_DoStyle, TRUE,
ASLFO_TitleText, DOpusGetString(locale, MSG_CHOOSEFONT),
TAGIF(cd->fontname[0], ASLFO_InitialName), cd->fontname,
TAGIF(cd->fontname[0], ASLFO_InitialSize), cd->txtattr.ta_YSize,
TAGIF(cd->fontname[0], ASLFO_InitialStyle), cd->txtattr.ta_Style,
TAGIF(cd->fontname[0], ASLFO_InitialFlags), cd->txtattr.ta_Flags,
ASLFO_InitialFrontPen, (cd->fontname[0] ? cd->itext[0].FrontPen : 1),
TAGIF(cd->fontname[0], ASLFO_InitialBackPen), cd->itext[0].BackPen,
TAGIF(cd->fontname[0], ASLFO_InitialDrawMode), cd->itext[0].DrawMode,
TAG_DONE ) )
{
cd->txtattr = cd->freq->fo_Attr;
if( cd->txtfont )
{
CloseFont( cd->txtfont );
}
strcpy( cd->fontname, cd->freq->fo_Attr.ta_Name );
cd->txtattr.ta_Name = cd->fontname;
cd->txtfont = OpenDiskFont( &cd->txtattr );
for( cd->running = 0; cd->running < 3; cd->running++ )
{
cd->itext[cd->running].ITextFont = &cd->txtattr;
cd->itext[cd->running].FrontPen = cd->freq->fo_FrontPen;
cd->itext[cd->running].BackPen = cd->freq->fo_BackPen;
cd->itext[cd->running].DrawMode = cd->freq->fo_DrawMode;
}
}
FreeAslRequest( cd->freq );
}
}
BOOL PicRequest( ClockData *cd )
{
STRPTR ptr;
if( (cd->freq = AllocAslRequest(ASL_FileRequest, NULL)) )
{
cd->buffer[0] = 0;
if( cd->picture[0] )
{
strcpy( cd->buffer, (ptr = FilePart(cd->picture)) );
*ptr = 0;
}
cd->running = FALSE;
while( !(cd->running = AslRequestTags( (struct FileRequester *) cd->freq,
ASLFR_Screen, cd->screen,
ASLFR_TitleText, DOpusGetString(locale, MSG_CHOOSEPIC),
TAGIF(cd->buffer[0], ASLFR_InitialFile), cd->buffer,
TAGIF(cd->picture[0], ASLFR_InitialDrawer), cd->picture,
TAG_DONE )) && IoErr() );
if( cd->running )
{
AddPart( cd->picture, ((struct FileRequester *) cd->freq)->fr_Drawer, 256 );
AddPart( cd->picture, ((struct FileRequester *) cd->freq)->fr_File, 256 );
}
else
{
if( cd->buffer[0] )
AddPart( cd->picture, cd->buffer, 256 );
}
FreeAslRequest( cd->freq );
}
return (BOOL) cd->running;
}
void DisableOther( PopUpMenu *popmenu, ULONG start, ULONG end, ULONG exclude )
{
ULONG counter;
PopUpItem *item;
GetPopUpItem( popmenu, exclude )->flags |= POPUPF_CHECKED;
for( counter = start; counter <= end; counter++ )
{
if( counter != exclude &&
( item = GetPopUpItem(popmenu, counter) )->flags & POPUPF_CHECKED )
item->flags ^= POPUPF_CHECKED;
}
}
/********************************************************************/
BOOL GetBitMap( ClockData *cd, STRPTR name )
{
cd->running = FALSE;
if( cd->bm )
{
if( strlen(name) )
{
if( (cd->obj = NewDTObject(name,
DTA_SourceType, DTST_FILE,
PDTA_Screen, cd->screen,
OBP_Precision, PRECISION_EXACT,
DTA_GroupID, GID_PICTURE,
PDTA_FreeSourceBitMap, TRUE,
TAG_DONE)) )
{
if( DoMethod( cd->obj, DTM_PROCLAYOUT, NULL, 1 ) )
{
GetDTAttrs( cd->obj,
PDTA_DestBitMap, &cd->sourcebm,
PDTA_BitMapHeader, &cd->sourcebmhead,
TAG_DONE );
cd->bsa.bsa_XSrcFactor = cd->bsa.bsa_SrcWidth = cd->sourcebmhead->bmh_Width;
cd->bsa.bsa_YSrcFactor = cd->bsa.bsa_SrcHeight = cd->sourcebmhead->bmh_Height;
cd->bsa.bsa_XDestFactor = cd->ibox.Width;
cd->bsa.bsa_YDestFactor = cd->ibox.Height;
cd->bsa.bsa_SrcBitMap = cd->sourcebm;
cd->bsa.bsa_DestBitMap = cd->bm;
BitMapScale( &cd->bsa );
cd->running = TRUE;
}
DisposeDTObject( cd->obj );
cd->obj = NULL;
}
}
}
return (BOOL) cd->running;
}
void BeepBeep( ClockData *cd )
{
if( cd->hour > 12 )
cd->hour -= 12;
switch( cd->minute )
{
case 0: if( (cd->flags & SOUND) && !(cd->flags & WRING_DONE) &&
(cd->sound = NewDTObject( "DOpus5:Sounds/Hour.snd",
DTA_GroupID, GID_SOUND,
TAG_DONE)) )
{
SetAttrs( cd->sound, SDTA_Cycles, !cd->hour ? 12 : cd->hour, TAG_DONE );
DoMethod( cd->sound, DTM_TRIGGER, NULL, STM_PLAY, TAG_DONE );
cd->flags |= WRING_DONE;
}
break;
case 1: if( cd->flags & WRING_DONE )
{
DisposeDTObject( cd->sound );
cd->flags ^= WRING_DONE;
cd->sound = NULL;
}
break;
case 15:
case 30:
case 45: if( (cd->flags & SOUND) && !(cd->flags & WRING_DONE) &&
(cd->sound = NewDTObject( "DOpus5:Sounds/Quarter.snd",
DTA_GroupID, GID_SOUND,
TAG_DONE)) )
{
SetAttrs( cd->sound, SDTA_Cycles, cd->minute/15, TAG_DONE );
DoMethod( cd->sound, DTM_TRIGGER, NULL, STM_PLAY, TAG_DONE );
cd->flags |= WRING_DONE;
}
break;
case 16:
case 31:
case 46: if( cd->flags & WRING_DONE )
{
DisposeDTObject( cd->sound );
cd->flags ^= WRING_DONE;
cd->sound = NULL;
}
break;
}
if( cd->flags & ALARM )
{
cd->woday[2] = cd->itext[2].IText[2];
if( !Strnicmp( cd->itext[2].IText, cd->woday, 4) )
{
if( !(cd->flags & ALARM_DONE) &&
cd->itext[2].IText[4] == cd->woday[4] )
{
if( (cd->flags & SOUND) &&
(cd->alarm = NewDTObject("DOpus5:Sounds/Alarm.snd",
DTA_GroupID, GID_SOUND,
TAG_DONE)) )
{
SetAttrs( cd->alarm, SDTA_Cycles, 3, TAG_DONE );
DoMethod( cd->alarm, DTM_TRIGGER, NULL, STM_PLAY, TAG_DONE );
}
LaunchCLI( ALARM_SCRIPT, NULL, NULL, NULL, NULL, NULL, NULL );
cd->flags |= ALARM_DONE ;
}
if( (cd->flags & ALARM_DONE) &&
cd->itext[2].IText[4] == cd->woday[4] + 1 )
{
DisposeDTObject( cd->alarm );
cd->flags ^= ALARM_DONE;
cd->alarm = NULL;
}
}
}
}
void GetAlarm( ClockData *cd )
{
cd->ncfg.nw_Parent = cd->win;
cd->ncfg.nw_Title = VERSION_STRING;
cd->ncfg.nw_Dims = &cfgwin;
cd->ncfg.nw_Locale = locale;
cd->ncfg.nw_Port = NULL;
cd->ncfg.nw_Flags = WINDOW_REQ_FILL | WINDOW_AUTO_KEYS | WINDOW_NO_CLOSE;
cd->ncfg.nw_Font = cd->txtfont;
cd->time_req = OpenConfigWindow( &cd->ncfg );
cd->olist = AddObjectList( cd->time_req, winobjects );
strncpy( cd->buffer, cd->woday, 2 )[2] = NULL;
StrToLong( cd->buffer, (LONG *)&cd->running );
cd->h = (UBYTE) cd->running;
SetGadgetValue( cd->olist, GADGET_ID_HOURS, cd->h*59/23 );
StrToLong( &cd->woday[3], (LONG *)&cd->running );
cd->min = (UBYTE) cd->running;
SetGadgetValue( cd->olist, GADGET_ID_MINUTES, cd->min );
sprintf( cd->buffer, "%02ld.%02ld", cd->h, cd->min );
SetGadgetValue( cd->olist, GADGET_ID_STRING, (ULONG) cd->buffer );
}
BOOL HandleOwnRequest( ClockData *cd )
{
cd->running = FALSE;
if( cd->time_req )
{
while( (cd->inmsg = GetWindowMsg( cd->time_req->UserPort)) )
{
switch( cd->inmsg->Class )
{
case IDCMP_MOUSEMOVE: //slider
switch( GET_ID(cd->inmsg) )
{
case GADGET_ID_HOURS:
cd->h = cd->inmsg->Code*23/59;
break;
case GADGET_ID_MINUTES:
cd->min = cd->inmsg->Code;
break;
}
sprintf( cd->buffer, "%02ld.%02ld",
cd->h,
cd->min );
SetGadgetValue( cd->olist, GADGET_ID_STRING, (ULONG) cd->buffer );
break;
case IDCMP_GADGETUP:
switch( GET_ID(cd->inmsg) )
{
case GADGET_ID_OK:
sprintf( cd->woday, "%02ld.%02ld",
cd->h,
cd->min );
cd->flags |= ALARM;
GetPopUpItem( &cd->popmenu, POPID_ALARMONOFF )->flags |= POPUPF_CHECKED;
if( (cd->flags & ALARM_DONE) )
{
DisposeDTObject( cd->alarm );
cd->flags ^= ALARM_DONE;
cd->alarm = NULL;
}
case GADGET_ID_CANCEL:
cd->running = TRUE;
break;
}
break;
}
ReplyWindowMsg( cd->inmsg);
}
}
return (BOOL) cd->running;
}
BOOL HandleIPC( ClockData *cd )
{
cd->running = FALSE;
while( (cd->ipcmsg = (APTR) GetMsg(cd->ipc->command_port)) )
{
if( cd->ipcmsg->command & CLOCK_QUIT )
{
cd->running = TRUE;
IPC_Reply( cd->ipcmsg );
break;
}
cd->day = 1;
if( cd->ipcmsg->command & BORDER )
{
cd->popitem = GetPopUpItem( &cd->popmenu, POPID_BORDER );
if( cd->ipcmsg->command & BORDER_ON )
{
cd->flags |= BORDER;
cd->popitem->flags |= POPUPF_CHECKED;
}
else
{
if( cd->flags & BORDER )
{
cd->flags ^= BORDER;
cd->popitem->flags ^= POPUPF_CHECKED;
}
}
if( cd->win )
BorderDraw( cd );
}
if( cd->ipcmsg->command & MODE_PASSED )
{
cd->itext[2].DrawMode = cd->itext[1].DrawMode =
cd->itext[0].DrawMode = ((CPrefsData *) cd->ipcmsg->data_free)->txtattr.ta_Flags;
}
if( cd->ipcmsg->command & STYLE_PASSED )
{
cd->itext[2].ITextFont->ta_Style = cd->itext[1].ITextFont->ta_Style =
cd->itext[0].ITextFont->ta_Style = ((CPrefsData *) cd->ipcmsg->data_free)->txtattr.ta_Style;
if( cd->win )
SetSoftStyle( cd->win->RPort, cd->itext[2].ITextFont->ta_Style, AskSoftStyle( cd->win->RPort));
}
if( cd->ipcmsg->command & APEN_PASSED )
{
cd->itext[2].FrontPen = cd->itext[1].FrontPen =
cd->itext[0].FrontPen = ((CPrefsData *) cd->ipcmsg->data_free)->ibox.Width;
}
if( cd->ipcmsg->command & BPEN_PASSED )
{
cd->itext[2].BackPen = cd->itext[1].BackPen =
cd->itext[0].BackPen = ((CPrefsData *) cd->ipcmsg->data_free)->ibox.Height;
}
if( cd->ipcmsg->command & BG_PIC )
{
if( cd->win )
{
cd->oldbm = cd->bm;
if( (cd->bm = AllocBitMap(cd->ibox.Width, cd->ibox.Height,
cd->screen->RastPort.BitMap->Depth,
BMF_MINPLANES, cd->screen->RastPort.BitMap)) )
{
if( GetBitMap(cd, ((CPrefsData *) cd->ipcmsg->data_free)->picture) )
{
FreeBitMap( cd->oldbm );
strcpy( cd->picture, ((CPrefsData *) cd->ipcmsg->data_free)->picture );
if( cd->flags & BG_PLAIN )
cd->flags ^= BG_PLAIN;
if( cd->flags & BG_TRANS )
cd->flags ^= BG_TRANS;
cd->flags |= BG_PIC;
DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_PICTURE );
}
else
{
FreeBitMap( cd->bm );
cd->bm = cd->oldbm;
}
BorderDraw( cd );
}
}
else
{
if( strlen(((CPrefsData *) cd->ipcmsg->data_free)->picture) )
{
strcpy( cd->picture, ((CPrefsData *) cd->ipcmsg->data_free)->picture );
if( cd->flags & BG_PLAIN )
cd->flags ^= BG_PLAIN;
if( cd->flags & BG_TRANS )
cd->flags ^= BG_TRANS;
cd->flags |= BG_PIC;
DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_PICTURE );
}
}
}
if( cd->ipcmsg->command & BG_PLAIN )
{
cd->flags |= BG_PLAIN;
if( cd->flags & BG_PIC )
cd->flags ^= BG_PIC;
if( cd->flags & BG_TRANS )
cd->flags ^= BG_TRANS;
DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_PLAIN );
if( cd->win )
{
if( cd->bm )
{
FreeBitMap( cd->bm );
cd->bm = NULL;
}
BorderDraw( cd );
}
}
if( cd->ipcmsg->command & BG_TRANS )
{
cd->flags |= BG_TRANS;
if( cd->flags & BG_PLAIN )
{
if( !cd->bm )
{
cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
cd->screen->RastPort.BitMap->Depth,
BMF_MINPLANES, cd->screen->RastPort.BitMap );
}
cd->flags ^= BG_PLAIN;
}
if( cd->flags & BG_PIC )
cd->flags ^= BG_PIC;
if( cd->win )
{
CloseWin( cd );
OpenWin( cd );
}
DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_TRANSPARENT );
}
if( cd->ipcmsg->command & ALARM )
{
if( strlen(((CPrefsData *) cd->ipcmsg->data_free)->alarm) )
{
strcpy(cd->woday, ((CPrefsData *) cd->ipcmsg->data_free)->alarm );
if( !(cd->flags & ALARM) )
{
cd->flags |= ALARM;
GetPopUpItem( &cd->popmenu, POPID_ALARM )->flags |= POPUPF_CHECKED;
}
}
else
{
if( cd->ipcmsg->command & ALARM_OFF )
{
if( (cd->flags & ALARM) )
{
cd->flags ^= ALARM;
GetPopUpItem( &cd->popmenu, POPID_ALARM )->flags ^= POPUPF_CHECKED;
}
}
else
{
cd->flags |= ALARM;
GetPopUpItem( &cd->popmenu, POPID_ALARM )->flags |= POPUPF_CHECKED;
}
}
}
if( cd->ipcmsg->command & SOUND )
{
if( cd->ipcmsg->command & SOUND_OFF )
{
if( cd->flags & SOUND )
{
cd->flags ^= SOUND;
GetPopUpItem( &cd->popmenu, POPID_SOUND )->flags ^= POPUPF_CHECKED;
}
}
else
{
cd->flags |= SOUND;
GetPopUpItem( &cd->popmenu, POPID_SOUND )->flags |= POPUPF_CHECKED;
}
}
if( cd->ipcmsg->command & NEW_FONT || cd->ipcmsg->command & NEW_SIZE )
{
if( cd->ipcmsg->command & NEW_FONT &&
Strnicmp(&((CPrefsData *) cd->ipcmsg->data_free)->fontname[cd->running=strlen(((CPrefsData *) cd->ipcmsg->data_free)->fontname)-5], ".font", 5) )
strcat( ((CPrefsData *) cd->ipcmsg->data_free)->fontname, ".font" );
if( cd->ipcmsg->command & NEW_FONT )
{
strcpy( cd->fontname, ((CPrefsData *) cd->ipcmsg->data_free)->fontname );
cd->txtattr.ta_Name = cd->fontname;
}
if( cd->ipcmsg->command & NEW_SIZE )
cd->txtattr.ta_YSize = ((CPrefsData *) cd->ipcmsg->data_free)->txtattr.ta_YSize;
if( cd->txtfont )
CloseFont( cd->txtfont );
cd->txtfont = OpenDiskFont( &cd->txtattr );
GetSizes( cd );
if( cd->bm )
{
FreeBitMap( cd->bm );
cd->bm = NULL;
}
if( cd->flags & BG_PIC || cd->flags & BG_TRANS )
{
cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
cd->screen->RastPort.BitMap->Depth,
BMF_MINPLANES, cd->screen->RastPort.BitMap );
if( cd->flags & BG_PIC )
GetBitMap( cd, cd->picture );
}
if( cd->win )
{
cd->ibox.Left = cd->win->LeftEdge;
cd->ibox.Top = cd->win->TopEdge;
CloseWin( cd );
OpenWin( cd );
}
}
if( cd->win )
PrintTime( cd );
cd->running = FALSE;
IPC_Reply( cd->ipcmsg );
}
return (BOOL) cd->running;
}
void InitPopMenu( ClockData *cd )
{
GetVar( CLOCKSTARTVAR, cd->buffer, 4, LV_VAR|GVF_GLOBAL_ONLY );
NewList( (struct List *) &cd->popmenu.item_list );
NewList( (struct List *) &cd->submenu );
NewList( (struct List *) &cd->subtime );
cd->popmenu.flags = POPUPMF_REFRESH;
cd->popmenu.callback = &refresh_callback;
cd->popmenu.locale = locale;
for( cd->running = MSG_POPSUB_ALARMSET; cd->running <= MSG_POPSUB_ALARMONOFF; cd->running++ )
{
if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
{
cd->popitem->item_name = (char *) cd->running;
cd->popitem->flags = POPUPF_LOCALE;
if( cd->running == MSG_POPSUB_ALARMONOFF )
cd->popitem->flags |= POPUPF_CHECKIT | (cd->flags & ALARM ? POPUPF_CHECKED : NULL);
cd->popitem->id = cd->running;
AddTail( (struct List *) &cd->subtime,
(struct Node *) &cd->popitem->node );
}
}
for( cd->running = MSG_POPSUB_PLAIN; cd->running <= MSG_POPSUB_PICTURE; cd->running++ )
{
if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
{
cd->popitem->item_name = (char *) cd->running;
cd->popitem->flags = POPUPF_LOCALE|POPUPF_CHECKIT;
if( cd->flags & (1 << (cd->running-MSG_POPSUB_PLAIN+9)) )
cd->popitem->flags |= POPUPF_CHECKED;
cd->popitem->id = cd->running;
AddTail( (struct List *) &cd->submenu,
(struct Node *) &cd->popitem->node );
}
}
for( cd->running = MSG_POP_CHANGEBACK; cd->running <= MSG_POP_ABOUT; cd->running++ )
{
if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
{
cd->popitem->item_name = (char *) cd->running;
cd->popitem->flags = POPUPF_LOCALE;
switch( cd->running )
{
case MSG_POP_CHANGEBACK:
cd->popitem->flags |= POPUPF_SUB;
cd->popitem->data = &cd->submenu;
break;
case MSG_POP_AUTOSTART :
cd->popitem->flags |= POPUPF_CHECKIT | (cd->buffer[0] == '1' ? POPUPF_CHECKED : NULL);
break;
case MSG_POP_BORDER :
cd->popitem->flags |= POPUPF_CHECKIT | (cd->flags & BORDER ? POPUPF_CHECKED : NULL);
break;
case MSG_POP_SOUND :
cd->popitem->flags |= POPUPF_CHECKIT | (cd->flags & SOUND ? POPUPF_CHECKED : NULL);
break;
case MSG_POP_ALARM :
cd->popitem->flags |= POPUPF_SUB;
cd->popitem->data = &cd->subtime;
break;
}
cd->popitem->id = cd->running - MSG_POP_CHANGEBACK;
AddTail( (struct List *) &cd->popmenu.item_list,
(struct Node *) &cd->popitem->node );
}
if( cd->running == MSG_POP_CHANGEFONT ||
cd->running == MSG_POP_ALARM ||
cd->running == MSG_POP_QUIT )
{
if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
{
cd->popitem->item_name = POPUP_BARLABEL;
cd->popitem->id = cd->running;
AddTail( (struct List *) &cd->popmenu.item_list,
(struct Node *) &cd->popitem->node );
}
}
}
}